package Algorithm.math;

/**
 * @author liujun
 * @version 1.0
 * @date 2020/5/15
 * @author—Email ljfirst@mail.ustc.edu.cn
 * @blogURL https://blog.csdn.net/ljfirst
 * @description 大整数乘法
 */
public class ArrayBigIntegersMulti2 extends ArrayBigIntegersOperation {

    //大整数乘法
    public String multiWithSymbol(String args, String args2) {

        // 异常和0值的判断
        if (!OperationCheck(args, args2) || args.equals("0") || args2.equals("0")) {
            return "0";
        }

        StringBuffer sb = new StringBuffer(args);
        StringBuffer sb2 = new StringBuffer(args2);
        //运算符判断
        int signal = 0;
        if ("-".equals(args.substring(0, 1))) {
            sb.delete(0, 1);
            signal++;
        }
        if ("-".equals(args2.substring(0, 1))) {
            sb2.delete(0, 1);
            signal++;
        }

        //两个数相乘的积位数不会大于两数位数之和
        int[] multiSum = new int[sb.toString().length() + sb2.toString().length()];
        //运算
        for (int i = sb.toString().length() - 1; i >= 0; i--) {
            for (int j = sb2.toString().length() - 1; j >= 0; j--) {
                // 计算单个值
                int temp = multiSum[i + j + 1] + (sb.toString().charAt(i) - '0') * (sb2.toString().charAt(j) - '0');
                // i + j + 1 是新数组的最后一个元素
                multiSum[i + j + 1] = temp % 10;
                multiSum[i + j] += temp / 10;

                // tips：值覆盖问题很难发现
                /* 比如这种写法就是错误的：multiSum[i + j + 1]存在值覆盖的问题
                int temp =   (sb.toString().charAt(i) - '0') * (sb2.toString().charAt(j) - '0');
                // i + j + 1 是新数组的最后一个元素
                multiSum[i + j + 1] = (multiSum[i + j + 1]+temp) % 10;
                multiSum[i + j] += (multiSum[i + j + 1]+temp) / 10;
                 */
            }
        }

        StringBuffer sb3 = new StringBuffer();
        //消除计算结果的前缀0
        int u = 0;
        while (multiSum[u] == 0) {
            u++;
        }
        //逆序
        for (; u <= multiSum.length - 1; u++) {
            sb3.append(multiSum[u]);
        }

        //带上运算符号
        if ((signal & 1) == 1) {
            sb3.insert(0, "-");
        }
        return sb3.toString();
    }
}
